#include "msgUtils.h"
#include <stdio.h>
#include <pthread.h>
#include <glib.h>
#include "sendConfigInfo.h"
#include "sendHeartInfo.h"

gchar* gateWayIp = NULL;
gchar* sn = NULL; //设备编号 
gchar* location = NULL;


gchar* getGateWayIp(){
    if (gateWayIp!=NULL)
    {
        return gateWayIp;
    }
    
    GKeyFile* keyFile = g_key_file_new();//用于读取文件

    //在这里可以使用config.ini来存储真正的配置文件地址
    //这样可以方便移植
    //链接存放地址的配置文件，读取真正配置文件（存放前端请求的数据文件的地址）地址
    if(!g_key_file_load_from_file(keyFile,"./config.ini",G_KEY_FILE_NONE,NULL)){
        g_warning("load config.ini error!");
        return NULL;
    }
    //读取信息
    gchar* data = g_key_file_get_string(keyFile,"config","devPath",NULL);

    GKeyFile* devFile = g_key_file_new();//用于存放数据

    if(!g_key_file_load_from_file(devFile,data,G_KEY_FILE_NONE,NULL)){
        g_warning("load config.ini error!");
        return NULL;
    }

    //获取相关配置信息  这里获取到了ip，同时我也获取了location，但是只返回了ip
    gateWayIp = g_key_file_get_string(devFile,"config","gatewayIp",NULL);
    location = g_key_file_get_string(devFile,"config","location",NULL);
    g_key_file_free(keyFile);
    g_key_file_free(devFile);

    return gateWayIp;
}

gchar* getSn(){
    if (sn != NULL)
    {
        printf("从缓存中获取到sn了\n");
        return sn;
    }

    //以下操作不行，因为虚拟机获取到的唯一标识是假的
    //打开文件
    //FILE* file =  fopen("/sys/class/dmi/id/product_serial","r");
    //给sn分配空间
    //sn = (gchar *)calloc(1,128);
    //读取一行数据到sn
    //fgets(sn,128,file);
    sn = "gnweogniogie";
    return sn;
}



void* recvFunction(void* param){
    while (1)
    {
        int mqId = getMqId();
        message msg = {
            .type = 1
        };
        int res = recvMsg(mqId,&msg);
        if (res == -1)
        {
            perror("recvMsg excute failed!\n");
        }
        printf("type = %ld , conntent = %s\n",msg.type,msg.content);

        getSn();
        //发送配置信息
        sendConfig(sn);
    }
}

int main(){
    //新开线程接收前端发送的数据
    pthread_t pid;
    pthread_create(&pid,NULL,recvFunction,NULL);
    while(1){
        //每几分钟发送一个消息给服务器
        //sn 网关
        //获取sn和gatewayIp
        if (!getGateWayIp())
        {
            continue;
        }
        printf("gateWayIp=%s,sn=%s\n",gateWayIp,sn);

        //发送心跳请求
        printf("一次心跳请求开始\n");
        sendHeartInfo(gateWayIp,sn);
        printf("一次心跳请求结束\n");
        sleep(10);
        
    }
    return 0;
}